package cn.tedu.straw.commons.vo;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 封装数据响应到客户端的JSON中
 */
@Data
@Accessors(chain = true)
public class R<T> implements Serializable {
    /**
     * 响应转态码
     */
    private Integer state;
    /**
     * 出错时的错误提示信息
     */
    private String message;
    /**
     * 成功时响应给客户端的数据
     */
    private T data;

    /**
     * 操作成功
     *
     * @return 状态码已经标记为成功的对象
     */
    public static R ok() {
        return new R().setState(State.SUCCESS);
    }

    /**
     * 操作成功 去响应数据
     *
     * @param data 需要响应到客户端的数据
     * @param <T>  响应到客户端的数据类型的占位符
     * @return 表示操作成功且封装了响应数据的对象
     */
    public static <T> R ok(T data) {
        return ok().setData(data);
    }

    /**
     * 操作失败
     *
     * @param failureState 操作失败的状态码
     * @param e            操作失败时抛出并被捕获的异常
     * @return 已经封装了操作失败的状态码，错误描述的对象
     * @see R.State
     */
    public static R failure(Integer failureState, Throwable e) {
        return new R().setState(failureState).setMessage(e.getMessage());
    }

    //状态码接口
    public interface State {
        //成功
        int SUCCESS = 2000;
        //邀请码错误
        int ERR_INVITE_CODE = 4000;
        //电话错误
        int ERR_PHONE_DUPLICATE = 4001;
        //插入错误
        int ERR_INSERT_FAIL = 4002;
        //参数格式错误
        int ERR_PARAMETER_VALIDATION = 4003;
        //班级被禁用
        int ERR_CLASS_DISABLED = 4004;
        //上传文件为空
        int ERR_UPLOAD_FILE_EMPTY = 4005;
        //上传文件超出限制
        int ERR_UPLOAD_FILE_SIZE = 4006;
        //上传文件类型错误
        int ERR_UPLOAD_FILE_TYPE = 4007;
        // IO异常
        int ERR_UPLOAD_IO = 4008;
        // 上传的文件状态错误
        int ERR_UPLOAD_FILE_STATE = 4009;
        // 查询问题不存在
        int ERR_QUESTION_NOT_FOUND = 4010;
        // 评论数据不存在
        int ERR_COMMENT_NOT_FOUND = 4011;
        // 拒绝访问
        int ERR_ACCESS_DENIED = 4012;
        // 数据删除失败
        int ERR_DELETE_FAIL = 4013;
        //未知错误
        int ERR_UNKNOWN = 9000;
    }


}
